from flask import render_template,g,current_app,jsonify,request
from . import newsdetail_bp
from info.utitls.common import user_login_data
from info.utitls.response_code import RET
from info.models import News,Comment
from info import constants, db


@newsdetail_bp.route('/<int:news_id>')
@user_login_data
def get_news_detail(news_id):

    user = g.user

    try:
        news_rank_list = News.query.order_by(News.clicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS)

    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询新闻数据异常")

    news_dict_list = []

    for news_obj in news_rank_list if news_rank_list else []:

        news_dict1 = news_obj.to_dict()

        news_dict_list.append(news_dict1)

    try:
        news = News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询新闻对象异常")

    news_dict = None

    if news:

        news_dict = news.to_dict()

    is_collected = False

    if news in user.collection_news:

        is_collected = True

    try:
        news_comment_list = Comment.query.filter(Comment.news_id == news_id)\
            .order_by(Comment.create_time.desc()).all()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询用户对象异常")

    comment_dict_list = []

    for comment_obj in news_comment_list if news_comment_list else []:

        comment_dict = comment_obj.to_dict()



        comment_dict_list.append(comment_dict)

    data = {
        "user_info": user.to_dict() if user else None,
        "news_rank_list": news_dict_list,
        "news": news_dict,
        "is_collected": is_collected,
        "comments": comment_dict_list
    }

    return render_template("news/detail.html", data=data)


@newsdetail_bp.route('/news_collect', methods=['POST'])
@user_login_data
def news_collect():
    """
        1.获取参数
            1.1 news_id:新闻id, user:当前登录的用户对象， action:收藏、取消收藏的行为
        2.校验参数
            2.1 非空判断
            2.2 约定action行为：action in ["collect", "cancel_collect"]
        3.逻辑处理
            3.0 根据新闻id获取新闻对象
            3.1 根据action行为判断是否收藏
            收藏：将新闻对象添加到用户收藏列表
            取消收藏：将新闻对象从用户收藏列表移除（前提：新闻已经在用户收藏列表才去取消收藏）
            3.2 修改操作保存到数据库
        4.返回值
            登录成功
        """
    user = g.user

    if not user:

        current_app.logger.error("用户未登陆")
        return jsonify(errno=RET.SESSIONERR, errmsg="用户未登陆")

    param_dict = request.json

    news_id = param_dict.get("news_id")

    action = param_dict.get("action")

    if not all([news_id, action]):

        current_app.logger.error("参数不足")
        return jsonify(errno=RET.PARAMERR, errmsg="参数不足")

    if action not in ["collect", "cancel_collect"]:

        current_app.logger.error("参数不足")
        return jsonify(errno=RET.PARAMERR, errmsg="参数不足")

    try:
        news = News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询异常")

    if not news:

        return jsonify(errno=RET.NODATA, errmsg="新闻步存在")

    if action == "collect":

        user.collection_news.append(news)

    else:

        if news in user.collection_news:

            user.collection_news.remove(news)

    try:
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg="查询用户对象异常")

    return jsonify(errno=RET.OK, errmsg="OK")


@newsdetail_bp.route('/news_comment', methods=["POST"])
@user_login_data
def news_comment():
    """
    1.获取参数
        1.1 user:当前登录的用户，news_id:新闻id，comment:评论内容，parent_id:主评论id（非必传）
    2.校验参数
        2.1 非空判断
    3.逻辑处理
        3.0 根据news_id查询出新闻对象(本身可以直接使用news_id给comment赋值，但是防止绕开前端发送请求的时候新闻不存在情况发送)
        3.1 创建评论模型
        3.2 保存到数据库
    4.返回值
        登录成功
    """
    user = g.user

    if not user:

        current_app.logger.error("用户未登陆")
        return jsonify(errno=RET.SESSIONERR, errmsg="用户未登陆")

    param_dict = request.json

    news_id = param_dict.get("news_id")

    comment_str = param_dict.get("comment")

    parent_id = param_dict.get("parent_id")

    if not all([news_id, comment_str, parent_id]):

        current_app.logger.error("参数不足")
        return jsonify(errno=RET.PARAMERR, errmsg="参数不足")

    try:
        news = News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询新闻对象异常")

    if not news:
        return jsonify(errno=RET.PARAMERR, errmsg="新闻不存在, 不能发表评论")

    comment = Comment()

    comment.user_id = user.id

    comment.news_id = news.id

    comment.content = comment_str

    if parent_id:

        comment.parent_id = parent_id

    try:
        db.session.add(comment)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg="保存评论对象异常")

    return jsonify(errno=RET.OK, errmsg="OK",data=comment.to_dict())
